if (!global->text_input)
return;
+ if (self->gesture)
+ gtk_event_controller_reset (GTK_EVENT_CONTROLLER (self->gesture));
global->current = context;
if (global->focused)
GdkRectangle *rect)
{
GtkIMContextWayland *context_wayland;
+ int side;
context_wayland = GTK_IM_CONTEXT_WAYLAND (context);
+ if (context_wayland->cursor_rect.x == rect->x &&
+ context_wayland->cursor_rect.y == rect->y &&
+ context_wayland->cursor_rect.width == rect->width &&
+ context_wayland->cursor_rect.height == rect->height)
+ return;
+
+ /* Reset the gesture if the cursor changes too far (eg. clicking
+ * between disjoint positions in the text).
+ *
+ * Still Allow some jittering (a square almost double the cursor rect height
+ * on either side) as clicking on the exact same position between characters
+ * is hard.
+ */
+ side = context_wayland->cursor_rect.height;
+
+ if (context_wayland->gesture &&
+ (ABS (rect->x - context_wayland->cursor_rect.x) >= side ||
+ ABS (rect->y - context_wayland->cursor_rect.y) >= side))
+ gtk_event_controller_reset (GTK_EVENT_CONTROLLER (context_wayland->gesture));
+
context_wayland->cursor_rect = *rect;
notify_cursor_location (context_wayland);
commit_state (context_wayland);